1、mysql 黑洞引擎就像黑洞一样,能接受数据,但把接受的数据扔掉,不存储数据,检查结果返回为空。
1 2 3 4 5 6 7
| mysql> CREATE TABLE test(i INT, c CHAR(10)) ENGINE = BLACKHOLE; Query OK, 0 rows affected (0.03 sec) mysql> INSERT INTO test VALUES(1,'record one'),(2,'record two'); Query OK, 2 rows affected (0.00 sec) Records: 2 Duplicates: 0 Warnings: 0 mysql> SELECT * FROM test; Empty set (0.00 sec)
|
2、创建黑洞引擎表,数据目录下回创建表格式文件,以表明开头后缀为.frm,没有与该表关联的其他文件
黑洞引擎支持所有类型的索引,定义表时,可以声明索引。
1 2
| ll test.* -rw-r----- 1 mysql mysql 8578 Sep 4 06:22 test.frm
|
3、可以通过show engines查看是否支持黑洞引擎:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| show engines; +--------------------+---------+----------------------------------------------------------------+--------------+------+------------+ | Engine | Support | Comment | Transactions | XA | Savepoints | +--------------------+---------+----------------------------------------------------------------+--------------+------+------------+ | InnoDB | DEFAULT | Supports transactions, row-level locking, and foreign keys | YES | YES | YES | | CSV | YES | CSV storage engine | NO | NO | NO | | MyISAM | YES | MyISAM storage engine | NO | NO | NO | | BLACKHOLE | YES | /dev/null storage engine (anything you write to it disappears) | NO | NO | NO | | PERFORMANCE_SCHEMA | YES | Performance Schema | NO | NO | NO | | MRG_MYISAM | YES | Collection of identical MyISAM tables | NO | NO | NO | | ARCHIVE | YES | Archive storage engine | NO | NO | NO | | MEMORY | YES | Hash based, stored in memory, useful for temporary tables | NO | NO | NO | | FEDERATED | NO | Federated MySQL storage engine | NULL | NULL | NULL | +--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
|
4、黑洞引擎表不存储任何数据,但是如果启用了二进制日志,sql语句会被记录并复制到从库,这对于中继机制和过滤机制很有用。
1
| 假设您的应用程序需要从属端过滤规则,但是传输所有的二进制数据到从库会造成很大的网络流量,在这种情况下,在主库设置存储引擎为黑洞的‘dummy’从进程,如下图所示:
|
1 2 3
| 主库写入二级制日志,‘dummy’mysqld 进程作为从进程执行,合并replicate-do-* 和replicate-ignore-*规则,自己写入一个新的,过滤好的二进制日志,该过滤日志传递给从库。 虚拟的进程不存储任何数据,因此外的mysqld进程复制主库信息产生少量的开销。 黑洞引擎表,insert触发器可正常使用,但是因为不存储数据,update和delete引擎没有激活,因为没有行,for each row触发器定义不适用。
|
5、黑洞引擎的用途:
1 2 3
| 1、验证转储文件语法 2、启用或禁用二级制日志,来测量二进制日志带来的开销 3、黑洞引擎本质上是一个无操作的引擎,因此可以用于查找与引擎本身无关的性能瓶颈。
|
黑洞引擎是交易感知的,提交的事物写入二进制日志,回滚事物不写入。
6、黑洞引擎和自动增量列的问题:
1 2 3 4
| 主从架构数据库:1、主库黑洞表有一个自动增量字段是主键;2、从服务器有相同表引擎为myisam,3、主库执行insert,并隐式设置增量值。 在这种情况下,主从复制将失败, 如果主站有许多从站,则在发送到从站之前进行过滤可能会减少网络流量。 在基于行的复制中,引擎为行返回的值对于每个插入始终是相同的。这将导致从服务器尝试使用主键列的相同值重播两个插入日志条目,因此复制将失败。
|
7、黑洞引擎和列过滤问题:
1 2 3 4
| 基于行的复制,从库支持表中缺少最后一列。 从库端执行过滤,在执行过滤之前,先将数据传到从库,最少有两种情况不希望将列拷贝到从库: 1、数据是机密的,从库没有权限访问它; 2、主库有多个从库,在发送到从库之前执行过滤用于减少网络带宽
|
官方文档提供的案例如下,对于受信任和不受信任从库的语句未找到合理解释,没看懂:
1 2 3 4 5 6 7 8
| 使用BLACKHOLE引擎和 --replicate-do-table或 --replicate-ignore-table选项,可以实现主列过滤, 主库配置: CREATE TABLE t1 (public_col_1, ..., public_col_N, secret_col_1, ..., secret_col_M) ENGINE=MyISAM; 受信任的从库配置: CREATE TABLE t1 (public_col_1, ..., public_col_N) ENGINE=BLACKHOLE; 不受信任的从库配置: CREATE TABLE t1 (public_col_1, ..., public_col_N) ENGINE=MyISAM;
|